package logic

import (
	"context"
	"errors"
	"fmt"
	"github.com/jinzhu/copier"
	"github.com/zeromicro/go-zero/core/logx"
	"grpc-common/ucenter/types/login"
	"listenboos-common/tools"
	"time"
	"ucenter-api/internal/svc"
	"ucenter-api/internal/types"
)

type LoginLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginLogic {
	return &LoginLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}
func (l *LoginLogic) WechatLogin(req *types.WechatLoginReq) (resp *types.WechatLoginResp, err error) {
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
	defer cancel()
	// 在这里调用微信接口还是其他地方？
	loginReq := &login.WechatReq{}
	err = copier.Copy(loginReq, req)
	if err != nil {
		return nil, err
	}
	loginResp, err := l.svcCtx.UCLoginRpc.WechatLogin(ctx, loginReq)
	if err != nil {
		return nil, errors.New("登录失败")
	}
	resp = &types.WechatLoginResp{}
	err = copier.Copy(resp, loginResp)
	fmt.Println(resp)
	if err != nil {
		return nil, err
	}
	return
}

func (l *LoginLogic) GetUserInfo(token string) (resp *types.GetUserInfo, err error) {
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Minute)
	defer cancel()
	// 在这里调用微信接口还是其他地方？
	req := &login.UserInfoReq{}
	req.Token = token
	loginResp, err := l.svcCtx.UCLoginRpc.GetUserInfo(ctx, req)
	if err != nil {
		return nil, errors.New("调用用户信息接口失败")
	}
	resp = &types.GetUserInfo{}
	err = copier.Copy(resp, loginResp)
	fmt.Println(resp)
	if err != nil {
		return nil, err
	}
	return
}

func (l *LoginLogic) UpdateUser(token string, req *types.UpdateUserReq) (int64, error) {
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Minute)
	defer cancel()
	id, err := tools.ParseToken(token, l.svcCtx.Config.JWT.AccessSecret)
	if err != nil {
		return 0, err
	}

	// 在这里调用微信接口还是其他地方？
	re := &login.UpdateUserReq{}
	err = copier.Copy(re, &req)
	if err != nil {
		return 0, err
	}
	re.Id = id
	_, err = l.svcCtx.UCLoginRpc.UpdateUser(ctx, re)
	if err != nil {
		return 0, errors.New("调用修改用户信息接口失败")
	}
	return id, nil
}

func (l *LoginLogic) FindAll() (*types.FindVipResp, error) {
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Minute)
	defer cancel()
	// 在这里调用微信接口还是其他地方？
	re := &login.FindAllServiceConfigReq{}
	vips, err := l.svcCtx.UCLoginRpc.FindAllServiceConfig(ctx, re)
	if err != nil {
		return nil, errors.New("调用修改用户信息接口失败")
	}
	// 在这里调用微信接口还是其他地方？
	resp := []*types.VipServiceConfig{}
	err = copier.Copy(&resp, &vips.VipServiceConfig)
	return &types.FindVipResp{VipSettingInterface: resp}, nil
}

func (l *LoginLogic) Collect(req types.CollectReq, userId int64) (int64, error) {
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Minute)
	defer cancel()
	// 在这里调用微信接口还是其他地方？
	re := &login.CollectTrackReq{}
	re.TrackId = req.TrackId
	re.UserId = userId
	res, err := l.svcCtx.UCLoginRpc.CollectTrack(ctx, re)
	if err != nil {
		return res.IsDeleted, errors.New("调用修改用户信息接口失败")
	}
	return res.IsDeleted, nil
}

func (l *LoginLogic) IsCollect(req types.CollectReq, userId int64) (int64, error) {
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Minute)
	defer cancel()
	// 在这里调用微信接口还是其他地方？
	re := &login.CollectTrackReq{}
	re.TrackId = req.TrackId
	re.UserId = userId
	res, err := l.svcCtx.UCLoginRpc.IsCollect(ctx, re)
	if err != nil {
		return res.IsCollect, errors.New("调用修改用户信息接口失败")
	}
	return res.IsCollect, nil
}

func (l *LoginLogic) GetAvailableAmount(userId int64) (float32, error) {
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Minute)
	defer cancel()
	// 在这里调用微信接口还是其他地方？
	re := &login.GetAccountBalanceReq{}
	re.UserId = userId
	re.UserId = userId
	res, err := l.svcCtx.UCLoginRpc.GetAccountBalance(ctx, re)
	if err != nil {
		return res.AccountBalance, errors.New("调用修改用户信息接口失败")
	}
	return res.AccountBalance, nil
}
